#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;
const int N=10000010;
int father[N+100];
bool done[N+100];
int a[1000100];
int tmax;
bool coprime(int a,int b)
{
	if(a>b)	swap(a,b);
	if(!a)	return b==1?true:false;
	return coprime(b%a,a);
}
int getUnion(int x)
{
	if(father[x]!=x) father[x]=getUnion(father[x]);
	return father[x];
}
void merge(int x,int y)
{
	if(x>tmax||y>tmax||!father[x]||!father[y]) return;
	x=getUnion(x);
	y=getUnion(y);
	father[y]=x;
}
void init(int n)
{
	for(int i=1;i*i<=n;i++)
		for(int j=i+1;j<=n;j++)
		{
			int a,b,c;
			a=j*j-i*i,b=2*j*i,c=j*j+i*i;
			if(a>n||b>n) break;
			//if(a<0||b<0||c<0) exit(-1);
			if(coprime(a,b)&&coprime(b,c)&&coprime(a,c))
			{
				merge(a,b);
				merge(a,c);
				merge(b,c);
			}
		}
}
int main()
{
	int n;
	tmax=-1;
	cin>>n;
	int res=0;
	for(int i=0;i<n;i++)
	{
		scanf("%d",a+i);
		father[a[i]]=a[i];
		tmax=max(a[i],tmax);
	}
	init(tmax);
	//fill(done,done+tmax+1,false);
	for(int i=0;i<n;i++)
	{
		int t=getUnion(a[i]);
		//printf("%d in union %d\n",a[i],t);
		if(!done[t])
		{
			res++;
			done[t]=true;
		}
		//else done[t]=false;
	}
	cout<<res<<endl;
	return 0;
}
